home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_se / assignment.e < prev    next >
Text File  |  2000-03-25  |  5KB  |  204 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr
  4. --                       http://SmallEiffel.loria.fr
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License
  11. -- for  more  details.  You  should  have  received a copy of the GNU General
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. class ASSIGNMENT
  17.    --
  18.    -- For instruction like :
  19.    --                          foo := bar;
  20.    --                          foo := bar + 1;
  21.    --
  22.    --
  23.  
  24. inherit INSTRUCTION;
  25.  
  26. creation make
  27.  
  28. feature
  29.  
  30.    left_side: EXPRESSION;
  31.  
  32.    right_side: EXPRESSION;
  33.  
  34.    end_mark_comment: BOOLEAN is false;
  35.  
  36.    is_pre_computable: BOOLEAN is
  37.       local
  38.          call: CALL;
  39.          rf6: RUN_FEATURE_6;
  40.       do
  41.          if right_side.is_pre_computable then
  42.             call ?= right_side;
  43.             if call /= Void then
  44.                rf6 ?= call.run_feature;
  45.                Result := rf6 = Void;
  46.             else
  47.                Result := true;
  48.             end;
  49.          end;
  50.       end;
  51.  
  52.    afd_check is
  53.       do
  54.          right_side.afd_check;
  55.       end;
  56.  
  57.    collect_c_tmp is
  58.       do
  59.          right_side.collect_c_tmp;
  60.       end;
  61.  
  62.    compile_to_c is
  63.       local
  64.          cast_t0: BOOLEAN;
  65.       do
  66.          cpp.se_trace_ins(start_position);
  67.          if right_side.is_current then
  68.             if left_type.is_reference then
  69.                cast_t0 := right_type.is_reference;
  70.             end;
  71.          end;
  72.          left_side.compile_to_c;
  73.          cpp.put_character('=');
  74.          if cast_t0 then
  75.             cpp.put_string("((T0*)(");
  76.          end;
  77.          right_side.compile_to_c;
  78.          if cast_t0 then
  79.             cpp.put_string("))");
  80.          end;
  81.          cpp.put_string(fz_00);
  82.       end;
  83.    
  84.    compile_to_jvm is
  85.       do
  86.          right_side.compile_to_jvm;
  87.          left_side.jvm_assign;
  88.       end;
  89.  
  90.    use_current: BOOLEAN is
  91.       do
  92.          Result := left_side.use_current;
  93.          Result := Result or else right_side.use_current;
  94.       end;
  95.  
  96.    stupid_switch(r: ARRAY[RUN_CLASS]): BOOLEAN is
  97.       do
  98.          if left_side.stupid_switch(r) then
  99.             if right_side.stupid_switch(r) then
  100.                Result := true;
  101.             end;
  102.          end;
  103.       end;
  104.  
  105.    right_type: TYPE is
  106.       do
  107.          Result := right_side.result_type;
  108.       ensure
  109.          Result /= Void
  110.       end;
  111.  
  112.    left_type: TYPE is
  113.       do
  114.          Result := left_side.result_type;
  115.       ensure
  116.          Result /= Void
  117.       end;
  118.  
  119.    start_position: POSITION is
  120.       do
  121.          Result := left_side.start_position;
  122.       end;
  123.  
  124.    to_runnable(ct: TYPE): like Current is
  125.       local
  126.          l, r: EXPRESSION;
  127.       do
  128.          l := left_side.to_runnable(ct);
  129.          if l = Void then
  130.             eh.add_position(left_side.start_position);
  131.             fatal_error(fz_blhsoa);
  132.          end;
  133.          r := right_side.to_runnable(ct);
  134.          if r = Void then
  135.             eh.add_position(right_side.start_position);
  136.             fatal_error(fz_brhsoa);
  137.          end;
  138.          if not r.result_type.is_a(l.result_type) then
  139.             eh.add_position(l.start_position);
  140.             fatal_error(" Bad assignment (VJAR).");
  141.          end;
  142.          if l = left_side and then r = right_side then
  143.             Result := implicit_conversion;
  144.          else
  145.             !!Result.make(l,r);
  146.             Result := Result.implicit_conversion;
  147.          end;
  148.       end;
  149.  
  150.    pretty_print is
  151.       do
  152.          pretty_print_assignment(left_side,":=",right_side);
  153.       end;
  154.  
  155. feature {ASSIGNMENT}
  156.  
  157.    implicit_conversion: like Current is
  158.       local
  159.          left_run_type, right_run_type: TYPE;
  160.          rhs: EXPRESSION;
  161.       do
  162.          left_run_type := left_type.run_type;
  163.          right_run_type := right_type.run_type;
  164.          if right_side.is_void and then left_run_type.is_expanded then
  165.             eh.add_position(right_side.start_position);
  166.             eh.append("Void may not be assigned to an %
  167.                       %expanded entity. Left hand side is ");
  168.             eh.add_type(left_type,".");
  169.             eh.print_as_error;
  170.          end;
  171.          rhs := conversion_handler.implicit_cast(right_side,left_run_type);
  172.          if rhs = right_side then
  173.             Result := Current;
  174.          else
  175.             !!Result.make(left_side,rhs);
  176.          end;
  177.       end;
  178.  
  179. feature {NONE}
  180.  
  181.    current_type: TYPE;
  182.  
  183.    make(ls: like left_side; rs: like right_side) is
  184.       require
  185.          ls.is_writable;
  186.          not ls.start_position.is_unknown;
  187.          rs /= Void
  188.       do
  189.          left_side := ls;
  190.          right_side := rs;
  191.       ensure
  192.          left_side = ls;
  193.          right_side = rs
  194.       end;
  195.  
  196. invariant
  197.  
  198.    left_side.is_writable;
  199.  
  200.    right_side /= Void
  201.  
  202. end -- ASSIGNMENT
  203.  
  204.